package com.shop.cereshop.app.dao.wallet;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.shop.cereshop.commons.domain.wallet.BuyerWallet;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;

/**
 * 用户钱包DAO接口
 * @author wang.yao
 * @date 2025-08-26
 */
@Mapper
public interface BuyerWalletDAO extends BaseMapper<BuyerWallet> {

    /**
     * 根据用户ID查询钱包信息
     * @param buyerUserId 用户ID
     * @return 钱包信息
     */
    BuyerWallet selectByUserId(@Param("buyerUserId") Long buyerUserId);

    /**
     * 根据用户ID查询钱包信息（包含锁定状态）
     * @param buyerUserId 用户ID
     * @return 钱包信息
     */
    BuyerWallet selectByUserIdWithLockStatus(@Param("buyerUserId") Long buyerUserId);

    /**
     * 更新支付密码
     * @param buyerUserId 用户ID
     * @param payPassword 加密后的支付密码
     * @param isSetPayPassword 是否设置支付密码
     * @param updateTime 更新时间
     * @return 影响行数
     */
    int updatePayPassword(@Param("buyerUserId") Long buyerUserId, 
                         @Param("payPassword") String payPassword,
                         @Param("isSetPayPassword") Boolean isSetPayPassword,
                         @Param("updateTime") String updateTime);

    /**
     * 更新支付密码错误次数和锁定时间
     * @param buyerUserId 用户ID
     * @param errorCount 错误次数
     * @param lockTime 锁定时间
     * @param updateTime 更新时间
     * @return 影响行数
     */
    int updatePayPasswordErrorInfo(@Param("buyerUserId") Long buyerUserId,
                                  @Param("errorCount") Integer errorCount,
                                  @Param("lockTime") String lockTime,
                                  @Param("updateTime") String updateTime);

    /**
     * 重置支付密码错误信息
     * @param buyerUserId 用户ID
     * @param updateTime 更新时间
     * @return 影响行数
     */
    int resetPayPasswordErrorInfo(@Param("buyerUserId") Long buyerUserId,
                                 @Param("updateTime") String updateTime);

    /**
     * 更新钱包余额
     * @param buyerUserId 用户ID
     * @param balance 新余额
     * @param updateTime 更新时间
     * @return 影响行数
     */
    int updateBalance(@Param("buyerUserId") Long buyerUserId,
                     @Param("balance") BigDecimal balance,
                     @Param("updateTime") String updateTime);

    /**
     * 扣减钱包余额（带余额检查）
     * @param buyerUserId 用户ID
     * @param amount 扣减金额
     * @param updateTime 更新时间
     * @return 影响行数
     */
    int deductBalance(@Param("buyerUserId") Long buyerUserId,
                     @Param("amount") BigDecimal amount,
                     @Param("updateTime") String updateTime);
}
